#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include "ringbuffer.hpp"

using namespace RingBufferModule;

void *produce(void *arg)
{
    RingBuffer<int> *rb = static_cast<RingBuffer<int> *>(arg);
    // 生产一个数据
    int data = 0;

    while (true)
    {
  
        rb->Equeue(data);
        sleep(1);
        std::cout << "produce data: " << data << std::endl;

        data++;
    }

    return nullptr;
}

void *consume(void *arg)
{
    RingBuffer<int> *rb = static_cast<RingBuffer<int> *>(arg);
    // 消费一个数据
 
    while (true)
    {
        sleep(2);
        int data;
        rb->dequeue(&data);
        std::cout << "consume data: " << data << std::endl;
    }
    return nullptr;
}

int main()
{
    // 创建线程

    pthread_t tid1, tid2,tid3, tid4;
    RingBuffer<int> *rb = new RingBuffer<int>(5);

    // 生产者线程
    pthread_create(&tid1, nullptr, produce, rb);
    pthread_create(&tid2, nullptr, produce, rb);
    pthread_create(&tid3, nullptr, produce, rb);
    // 消费者线程
    pthread_create(&tid4, nullptr, consume, rb);

    // 等待线程结束
    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);
    pthread_join(tid3, nullptr);
    pthread_join(tid4, nullptr);
    
    return 0;
}
